package com.errol.generic.http;

import com.fasterxml.jackson.core.type.TypeReference;
import org.springframework.http.HttpStatus;

import java.nio.charset.Charset;
import java.util.Map;

/**
 * @author zhang xiao bin
 * @version v1.0
 * @date 2020/10/16
 * @since v
 **/
public interface HttpLogger {

    /**
     * 对 reqParams 执行 UrlEncode 时异常，将 reqParams 中的参数编码成 k1=v1&k2=v2 格式，且 k1 v1 k2 v2 都会执行 UrlEncode
     *
     * @param url       请求 url
     * @param reqParams 进行编码的参数
     * @param charset   编码字符集格式
     * @param exception 参数编码异常
     */
    void paramException(String url, Map<String, Object> reqParams, Charset charset, Exception exception);

    /**
     * 对 requestBody 参数进行 json 序列化时异常，requestData 和 reqParams 可以同时存在，会一起转换成 json string
     *
     * @param url         请求 url
     * @param requestData javaBean 的请求对象
     * @param reqParams   map 格式的请求参数
     * @param exception   json 序列化异常
     */
    void paramException(String url, Object requestData, Map<String, Object> reqParams, Exception exception);

    /**
     * 读取响应体 inputStream 时异常
     *
     * @param url       请求 url
     * @param bytes     已读取的字节数组
     * @param exception 抛出的异常
     */
    void paramException(String url, byte[] bytes, Exception exception);

    /**
     * 从响应体读取 bytes 后转换成泛型 json 对象时异常
     *
     * @param url           请求 url
     * @param bytes         从响应体成功读取的字节数组
     * @param charset       请求设置的字符集格式
     * @param typeReference 请求成功时预期的泛型对象类型: new TypeReference<T>() {}
     * @param exception     解析异常
     * @param <T>           目标泛型类型
     */
    <T> void paramException(String url, byte[] bytes, Charset charset, TypeReference<T> typeReference, Exception exception);

    /**
     * 从响应体读取 bytes 后转换成 json 对象时异常
     *
     * @param url        请求 url
     * @param bytes      从响应体成功读取的字节数组
     * @param charset    请求设置的字符集格式
     * @param resultType 请求成功时预期的对象类型
     * @param exception  解析异常
     */
    void paramException(String url, byte[] bytes, Charset charset, Class<?> resultType, Exception exception);

    /**
     * HTTP 第三方工具包创建实例时异常
     *
     * @param url       请求 url
     * @param exception 抛出的异常
     */
    void componentException(String url, Exception exception);

    /**
     * HTTP 第三方工具包添加 requestHeader 时异常
     *
     * @param url         请求 url
     * @param headerKey   尝试添加的 header.key
     * @param headerValue 尝试添加的 header.value
     * @param exception   抛出的异常
     */
    void componentException(String url, String headerKey, String headerValue, Exception exception);

    /**
     * HTTP 第三方工具包将请求参数写入 requestBody 时异常
     *
     * @param url         请求 url
     * @param bodyDataStr 请求参数 string
     * @param charset     string 转 byte[] 时的字符集编码格式
     * @param exception   抛出的异常
     */
    void componentException(String url, String bodyDataStr, Charset charset, Exception exception);

    /**
     * HTTP 第三方工具包调用 http 请求时异常
     *
     * @param url             请求 url
     * @param responseSuccess true 表示响应 code 200，读取输入流异常；false 表示请求过程异常
     * @param exception       抛出的异常
     */
    void componentException(String url, boolean responseSuccess, Exception exception);

    /**
     * 接口调用返回失败，code != 200
     *
     * @param url        请求 url
     * @param httpStatus 响应 code
     * @param response   响应体
     */
    void httpFailed(String url, HttpStatus httpStatus, String response);
}
